package com.evil.application.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.evil.application.convert.DataConvert;
import com.evil.application.mapper.ApplicationOrderDataMapper;
import com.evil.application.pojo.dto.form.control.option.FormOptionRespDTO;
import com.evil.application.pojo.dto.order.InitControlDataRespDTO;
import com.evil.application.pojo.entity.*;
import com.evil.common.application.dto.order.data.ControlDataDTO;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

/**
 * 应用订单数据表
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
public interface ApplicationOrderDataService extends IService<ApplicationOrderData> {

    @Override
    ApplicationOrderDataMapper getBaseMapper();

    /**
     * 获取订单数据转换工具
     *
     * @return DataConvert
     */
    DataConvert getDataConvert();

    /**
     * 初始化应用订单数据（机器人创建订单）
     *
     * @param applicationId applicationId
     * @return InitControlDataDTO
     */
    InitControlDataRespDTO initAppOrderData(Long applicationId);

    /**
     * 关联控件数据
     *
     * @param orderDataId orderDataId
     * @param dataConvert 订单数据转换 处理缓存
     * @return FormOptionRespDTO
     */
    FormOptionRespDTO orderRelatedSelect(Long orderDataId, DataConvert dataConvert);

    /**
     * 关联控件数据列表
     *
     * @param orderDataIds orderDataIds
     * @param dataConvert  dataConvert
     * @return FormOptionRespDTO 列表
     */
    List<FormOptionRespDTO> orderRelatedSelect(Collection<Long> orderDataIds, DataConvert dataConvert);

    /**
     * 关联控件数据map
     *
     * @param orderDataIds orderDataIds
     * @param dataConvert  dataConvert
     * @return FormOptionRespDTO map
     */
    Map<Long, FormOptionRespDTO> orderRelatedSelectMap(Collection<Long> orderDataIds, DataConvert dataConvert);

    /**
     * 获取订单数据
     *
     * @param orderId orderId
     * @return ApplicationOrderData 列表
     */
    List<ApplicationOrderData> orderDataList(Long orderId);

    /**
     * 获取订单数据
     *
     * @param orderIds orderIds
     * @return ApplicationOrderData 列表
     */
    List<ApplicationOrderData> ordersDataList(Collection<Long> orderIds, boolean filterDeleted);

    /**
     * 订单数据
     *
     * @param orderId orderId
     * @return List
     */
    List<ControlDataDTO> getOrderControlData(Long orderId);

    /**
     * 订单数据
     *
     * @param applicationOrder applicationOrder
     * @return List
     */
    List<ControlDataDTO> getOrderControlData(ApplicationOrder applicationOrder);

    /**
     * 获取订单指定节点数据
     *
     * @param applicationOrder applicationOrder
     * @param processNode      processNode
     * @param perfect          是否完善数据详细信息
     * @return List
     */
    List<ControlDataDTO> getOrderControlData(ApplicationOrder applicationOrder, ApplicationProcessNode processNode, boolean perfect);

    /**
     * 获取订单指定节点数据
     *
     * @param applicationOrder applicationOrder
     * @param orderDataList    orderDataList
     * @param processNode      processNode
     * @param perfect          是否完善数据详细信息
     * @return List
     */
    List<ControlDataDTO> getOrderControlData(ApplicationOrder applicationOrder, List<ApplicationOrderData> orderDataList, ApplicationProcessNode processNode, boolean perfect);

    /**
     * 订单列表 数据列表
     *
     * @param orders                orders
     * @param filterNodeVisibleData filterNodeVisibleData
     * @param perfect               是否完善数据详细信息
     * @return OrdersControlDataDTO
     */
    Map<Long, List<ControlDataDTO>> orderListData(Collection<ApplicationOrder> orders, boolean filterNodeVisibleData, boolean perfect);

    /**
     * 订单列表 数据列表
     *
     * @param orders                orders
     * @param ordersDataList        ordersDataList
     * @param filterNodeVisibleData filterNodeVisibleData
     * @param perfect               是否完善数据详细信息
     * @return OrdersControlDataDTO
     */
    Map<Long, List<ControlDataDTO>> orderListData(Collection<ApplicationOrder> orders, List<ApplicationOrderData> ordersDataList, boolean filterNodeVisibleData, boolean perfect);

    /**
     * 校验订单数据，通过时保存，并且重新获取最新数据
     *
     * @param app    app
     * @param form   form
     * @param order  order
     * @param data   data
     * @param nodeId nodeId
     * @return 重新获取最新数据
     */
    List<ControlDataDTO> checkAndSave(ApplicationInfo app, ApplicationForm form, ApplicationOrder order, List<ControlDataDTO> data, Long nodeId);

    /**
     * 校验订单数据
     *
     * @param app     app
     * @param oldData oldData
     * @param data    data
     * @param nodeId  nodeId
     */
    void verifyOrderDataList(ApplicationInfo app, List<ControlDataDTO> oldData, List<ControlDataDTO> data, Long nodeId);

    /**
     * 处理并保存表单数据
     *
     * @param app      app
     * @param form     form
     * @param order    order
     * @param isCreate 是否为创建
     * @param data     data
     */
    void handleAndSave(ApplicationInfo app, ApplicationForm form, ApplicationOrder order, Collection<ControlDataDTO> data, boolean isCreate);

    /**
     * 处理并保存表单数据
     *
     * @param app      app
     * @param form     form
     * @param order    order
     * @param isCreate 是否为创建
     * @param data     data
     */
    void handleAndSave(ApplicationInfo app, ApplicationForm form, ApplicationOrder order, List<ApplicationOrderData> orderDataList, Collection<ControlDataDTO> data, boolean isCreate);

    /**
     * 处理表单数据
     *
     * @param app      app
     * @param form     form
     * @param order    order
     * @param isCreate 是否为创建
     * @param data     data
     */
    List<ApplicationOrderData> handle(ApplicationInfo app, ApplicationForm form, ApplicationOrder order, Collection<ControlDataDTO> data, boolean isCreate);

    /**
     * 处理表单数据
     *
     * @param app           app
     * @param form          form
     * @param order         order
     * @param orderDataList orderDataList
     * @param data          data
     * @param isCreate      是否为创建
     */
    List<ApplicationOrderData> handle(ApplicationInfo app, ApplicationForm form, ApplicationOrder order, List<ApplicationOrderData> orderDataList, Collection<ControlDataDTO> data, boolean isCreate);

    /**
     * 修改订单节点处理人数据
     *
     * @param order      order
     * @param nodeHandle nodeHandle
     */
    void modifyOrderNodeData(ApplicationOrder order, Consumer<ApplicationOrderData> nodeHandle);

    /**
     * 保存订单数据
     *
     * @param orderDataList orderDataList
     */
    void save(List<ApplicationOrderData> orderDataList);

    /**
     * 刷新ES订单
     *
     * @param orderId orderId
     */
    void refreshEsOrderId(Long orderId);

    /**
     * 刷新搜索引擎
     *
     * @param orderIds orderIds
     */
    void refreshEsOrderIds(Collection<Long> orderIds);
}
